package br.com.unioConci.consulta.apresentacao;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import javax.faces.event.ActionEvent;

import br.com.r2.exception.R2Exception;
import br.com.r2.util.tipodado.Data;
import br.com.r2.util.tipodado.Flag;
import br.com.r2.util.tipodado.Inteiro;
import br.com.r2.util.tipodado.Moeda;
import br.com.r2.util.tipodado.Texto;
import br.com.r2.util.tipodado.YesNo;
import br.com.unioConci.cadastro.negocio.LocalPagamentoNgc;
import br.com.unioConci.cadastro.vo.LocalPagamentoVo;
import br.com.unioConci.consulta.negocio.ConsultaConciliacaoSinteticoNgc;
import br.com.unioConci.consulta.vo.ConciliacaoSinteticoPK;
import br.com.unioConci.consulta.vo.ConsultaConciliacaoSinteticoVo;
import br.com.unioConci.consulta.vo.filtro.FiltroConsultaVo;
import br.com.unioConci.util.Colecao;
import br.com.unioConci.util.jsf.AbstractBean;

public class ConsultaConciliacaoSinteticoBean extends AbstractBean<ConsultaConciliacaoSinteticoVo, ConsultaConciliacaoSinteticoNgc>
{

   private List<LocalPagamentoVo> listaLocaisPagamentos;

   private Moeda valorTotalFinanceiro;

   private Moeda valorTotalRazao;

   private Moeda valorTotalDiferenca;
   
   public ConsultaConciliacaoSinteticoBean()
   {
      super(ConsultaConciliacaoSinteticoNgc.getInstancia());
      this.ACTION_SEARCH = "consultaConciliacaoSintetico";
      this.pageTitle = "titulo_consulta_conciliacao_sintetica";

   }
   
   @Override
   public String preparaPesquisar()
   {
      String retorno = super.preparaPesquisar();
      Calendar filtroData = new GregorianCalendar();
      filtroData.setTime(new Date());
      filtroData.add(Calendar.DAY_OF_MONTH, -1);
      if (this.getSearchObject().getConciliacaoSinteticaPK() == null)
      {
         this.getSearchObject().setConciliacaoSinteticaPK(new ConciliacaoSinteticoPK());
      }
      if (this.getSearchObject().getFiltro() == null)
      {
         this.getSearchObject().setFiltro(new FiltroConsultaVo());
      }
      this.getSearchObject().getFiltro().setDataBaixaInicial(new Data(filtroData.getTime()));
      this.getSearchObject().getFiltro().setDataBaixaFinal(new Data(filtroData.getTime()));
      this.getSearchObject().setPossuiDivergencia(new Flag(YesNo.ALL));
      
      return retorno;
   }
   
   @Override
   protected void setListaPesquisa() throws R2Exception
   {
      this.listaLocaisPagamentos = new ArrayList<LocalPagamentoVo>();

      // lista de local de pagamento sintetico
      LocalPagamentoVo localPagamentoVo = new LocalPagamentoVo();
      localPagamentoVo.setTipoConciliacao(new Inteiro(LocalPagamentoNgc.TIPO_CONCILIACAO_SINTETICO));
      List<LocalPagamentoVo> listaResultado = LocalPagamentoNgc.getInstancia().pesquisar(localPagamentoVo, 0);
      
      if (listaResultado != null && listaResultado.size() > 0)
      {
         LocalPagamentoVo vazio = new LocalPagamentoVo();
         vazio.setDescricao(new Texto(""));
         
         this.listaLocaisPagamentos.add(vazio);
         this.listaLocaisPagamentos.addAll(listaResultado);
      }
   }
   
   @Override
   protected void validarPesquisar() throws R2Exception
   {
      if (this.getSearchObject().getFiltro() == null)
      {
         throw new R2Exception("peloMenosUmDosCamposObrigatorios");
      }
      boolean dataBaixaPreenchida = this.getSearchObject().getFiltro().getDataBaixaInicial() == null 
                                    || !this.getSearchObject().getFiltro().getDataBaixaInicial().isPreenchido();

//      boolean dataInclusaoPreenchida = this.getSearchObject().getFiltro().getDataInclusaoInicial() == null 
//                                    || !this.getSearchObject().getFiltro().getDataInclusaoInicial().isPreenchido();

      
      if (dataBaixaPreenchida)
      {
         throw new R2Exception("peloMenosUmDosCamposObrigatorios");
      }
   }

   @Override
   public void pesquisar(ActionEvent event)
   {
      super.pesquisar(event);
      
      List<ConsultaConciliacaoSinteticoVo> listaResultado = this.getSearchResult();
      double totalValorFinanceiro = 0;
      double totalValorRazao = 0;
      double totalValorDiferenca = 0;
      if (listaResultado != null && listaResultado.size() > 0)
      {
        totalValorRazao = Colecao.somaCampo(listaResultado, "ValorRazao");
        totalValorFinanceiro = Colecao.somaCampo(listaResultado, "ValorFinanceiro");
        totalValorDiferenca = Colecao.somaCampo(listaResultado, "DiferencaValor");
      }
      
      this.valorTotalRazao = new Moeda(totalValorRazao);
      this.valorTotalFinanceiro = new Moeda(totalValorFinanceiro);
      this.valorTotalDiferenca = new Moeda(totalValorDiferenca);
   }

   public List<LocalPagamentoVo> getListaLocaisPagamentos()
   {
      return listaLocaisPagamentos;
   }

   public void setListaLocaisPagamentos(List<LocalPagamentoVo> listaLocaisPagamentos)
   {
      this.listaLocaisPagamentos = listaLocaisPagamentos;
   }

   public Moeda getValorTotalFinanceiro()
   {
      return valorTotalFinanceiro;
   }

   public void setValorTotalFinanceiro(Moeda valorTotalFinanceiro)
   {
      this.valorTotalFinanceiro = valorTotalFinanceiro;
   }

   public Moeda getValorTotalRazao()
   {
      return valorTotalRazao;
   }

   public void setValorTotalRazao(Moeda valorTotalRazao)
   {
      this.valorTotalRazao = valorTotalRazao;
   }

   public Moeda getValorTotalDiferenca()
   {
      return valorTotalDiferenca;
   }

   public void setValorTotalDiferenca(Moeda valorTotalDiferenca)
   {
      this.valorTotalDiferenca = valorTotalDiferenca;
   }
}
